

using System;
using System.IO;
using System.Security;

namespace CUtil
{
	/// <summary>
	/// Summary description for FileDetails.
	/// </summary>
	[Serializable]
	public class FileDetails : IDisposable
	{

		private string strLocation;
		private string strError;
		private bool bError;
		private FileStream readStream;
		private FileInfo fileInfo;
		private bool bNewFile;

		/// <summary>
		/// check if there is an error
		/// </summary>
		public bool Error
		{
			get
			{
				return bError;
			}
		}

		/// <summary>
		/// get the error message
		/// </summary>
		public string ErrorMessage
		{
			get
			{
				return strError;
			}
		}

		/// <summary>
		/// get the file info
		/// </summary>
		public FileInfo GetInfo
		{
			get
			{
				return fileInfo;
			}
		}

		/// <summary>
		/// get the file stream
		/// </summary>
		public FileStream GetStream
		{
			get
			{
				return readStream;
			}
		}

		/// <summary>
		/// check if the file is newly created
		/// </summary>
		public bool NewFile
		{
			get
			{
				return bNewFile;
			}
		}

		/// <summary>
		/// Need to be able to get around csharp thinking variable is not initialised when 
		/// calling new in a try blocak and attempting to use it outside of the catch statement
		/// </summary>
		public FileDetails()
		{
		}

		/// <summary>
		/// constructor
		/// </summary>
		/// <param name="strLocation">file to open</param>
		public FileDetails( string strLocation )
		{
			Open( strLocation );
		}


		public void Dispose()
		{
			readStream.Close();
		}


		/// <summary>
		/// open the file
		/// </summary>
		/// <param name="strLocation">file to open</param>
		/// <returns>true on success</returns>
		public bool Open( string strLocation )
		{
			bError = false;
			bNewFile = false;
			//
			// TODO: Add constructor logic here
			//

			this.strLocation = strLocation;

			try
			{
				fileInfo = new FileInfo( strLocation );
				if( fileInfo.Exists == false )
					bNewFile = true;
				readStream = fileInfo.Open( FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite );
			}
			catch( ArgumentNullException argNullExp )
			{
				strError = "Error argument null exception thrown getting the file " + strLocation + " " + argNullExp.Message;
				bError = true;
			}
			catch( SecurityException secExp )
			{
				strError = "Error security exception thrown getting the file " + strLocation + " " + secExp.Message;
				bError = true;
			}
			catch( ArgumentException argExp )
			{
				strError = "Error argument exception thrown getting the file " + strLocation + " " + argExp.Message;
				bError = true;
			}
			catch( UnauthorizedAccessException unaExp )
			{
				strError = "Error unauthorised access exception thrown getting the file " + strLocation + " " + unaExp.Message;
				bError = true;
			}
			catch( PathTooLongException ptolExp )
			{
				strError = "Error path too long exception thrown getting the file " + strLocation + " " + ptolExp.Message;
				bError = true;
			}
			catch( NotSupportedException nsepExp )
			{
				strError = "Error security exception thrown getting the file " + strLocation + " " + nsepExp.Message;
				bError = true;
			}
			catch( IOException ioExp )
			{
				strError = "Error io exception thrown getting the file " + strLocation + " " + ioExp.Message;
				bError = true;
			}

			return bError == true? false:true;
		}


	}
}
